#include <iostream>
#include<signal.h>
#include "../comm/httplib.h"
#include "oj_control.hpp"
#include <ctemplate/template.h>

using namespace httplib;

/********************************
 * oj_server.cc模块:
 *  本质就是一个小型的网站....，给用户提供服务的
 *  1.用户获取题目列表服务
 *  2.用户获取具体题目信息进行编写代码服务
 *  3.用户提交代码进行编译运行服务
 * *********************************/

static ns_control::Control* ctl_ptr = nullptr;

void handler(int sigo) //一但有主机下线就执行该方法
{
    ctl_ptr->RecoverMachine(); //恢复下线的主机上线
}

void Usage(const std::string &proc)
{
    std::cout << "Uage:" << proc << " port" << std::endl;
}

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        Usage(argv[0]);
        return 1;
    } 
    signal(SIGINT,handler); 

    //提供给用户请求网站时候路由的功能
    Server svr;

    ns_control::Control ctl; //这里会加载所有题目到内存，并且加载主机的ip+port到内存
    ctl_ptr = &ctl;

    svr.set_base_dir("./wwwroot");

    //用户获取的题目列表
    svr.Get("/all_questions", [&ctl](const Request &req, Response &resq)
            {
        std::string html;
        ctl.AllQuestions(&html);
        resq.set_content(html,"text/html;charset=utf-8"); });

    //用户根据题目编号，获取题目描述，预设代码--->进行编译
    //\d+:正则表达式，匹配一个或多个
    svr.Get(R"(/question/(\d+))", [&ctl](const Request &req, Response &resq)
            {
                std::string number = req.matches[1]; //获取正则表达式的内容--->这里表示为题号
                std::string html;

                ctl.OneQuestion(number, &html);
                resq.set_content(html, "text/html;charset=utf-8"); });
    //用户提交代码，使用判题系统
    svr.Post(R"(/judge/(\d+))", [&ctl](const Request &req, Response &resp)
             {   
                 std::string number = req.matches[1]; //获取正则表达式的内容--->这里表示为题号
                 std::string out_json;
                 ctl.Judge(number, req.body, &out_json);
                 resp.set_content(out_json, "application/json;charset=utf-8"); });
                 
    svr.listen("0.0.0.0", std::stoi(argv[1]));
    return 0;
}
